// options === app.config.errorHandler
const fs = require('fs')
function clean_tmp(app, ctx) {
  if (ctx.files && ctx.files.length) {
    for (let file of ctx.files) {
      if (file.path && fs.existsSync(file.path)) {
        fs.unlinkSync(file.path)
      }
    }
  }
}
module.exports = (options, app) => {
  return async function errorHandler(ctx, next) {
    try {
      console.log('errorHandler', __line, ctx.request.path)
      await next();
    } catch (err) {
      // x-requested-with !== 'XMLHttpRequest'
      if (!ctx.get('x-requested-with')) {
        throw err
      }
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      ctx.app.emit('error', err, ctx);

      const status = err.status || 500;
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      const error = status === 500 && ctx.app.config.env === 'prod'
        ? 'Internal Server Error'
        : err.message;

      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = { error };
      if (status === 422) {
        ctx.body.detail = err.errors;
      }
      ctx.status = status;
    }
    clean_tmp(app, ctx)
  };
};